package com.skh.linkedlist;

/**
 * @Author: skh
 * @Date: 2019/6/10 18:16
 * @Description: 203.移除链表元素
 */
public class RemoveElements {

    /*
    删除链表中等于给定值 val 的所有节点。

    示例:

    输入: 1->2->6->3->4->5->6, val = 6
    输出: 1->2->3->4->5
     */

    /*
     *
     * (1) 我们需要先将链表的头结点保存下来，但是有一种情况需要注意：
     *
     * 头节点的值也要被删除的时候(head.val == val)，我们不能简单的直接将head保存起来，要把链表前面连续的需要删除的节点
     * 从链表移除出去，得到一个头节点不需要被删除的新链表(head.val != val)。
     *
     * 也就是第1个循环所做的事情。
     *
     * 这里需要再做一次非空校验，例如输入[1,1,1] ，1； 链表全是1，执行过(1)后，新链表为空，直接返回null即可。
     *
     * (2) node 的初始值是头节点（不等于val），循环遍历链表的时候，每次执行的操作是 判断下一个节点 是否要删除，即
     * 比较node.next.val 和 val，
     *
     * 如果相等，将 判断的节点（node.next）移出链表，node.next = node.next.next
     *
     * 如果不相等，继续往后遍历，node = node.next
     *
     * (3) 最后返回head ---------------------！
     */

    public ListNode removeElements(ListNode head, int val) {


        if (head == null) {
            return null;
        }

        while (head != null && head.val == val) {
            head = head.next;
        }

        if (head == null) {
            return head;
        }

        ListNode p = head;

        while (p.next != null) {
            if (p.next.val == val) {
                p.next=p.next.next;
            }else {
                p=p.next;
            }
        }

        return head;

    }


}
